#ifndef _COMMFORMAT_H_
#define _COMMFORMAT_H_

#pragma pack(push)
#pragma pack(1)

#include <netinet/in.h>	//in_addr, in6_addr
#include <sys/types.h>	//u_int16_t


/*
 * 数据类型命名规则：
 * 结构体名使用驼峰式，成员使用匈牙利式风格
 * 2009-7-7 by Xu Bingqing
 * */

struct CommKey
{
	char* ip_addr;
	int port;
};

/*
 * send msg format
 * */
struct ReqCtrlMsg			//请求控制报文
{
	unsigned char type;		//标识此报文的类型
	unsigned char resp;		//告诉VR对此报文的响应方式
	unsigned char vlink_no;		//指定Vlink
	unsigned char stat;		//控制Vlink的启动、关闭
};

struct VlinkParam
{
	unsigned char vlink_no;
	unsigned short int hello_interval;
	unsigned long int local_ip_addr;
	unsigned long int peer_ip_addr;
	struct in6_addr vr_addr;
};

struct VrConfPkt			//vlink配置管理报文
{
	unsigned char type;
	unsigned char oper;
	struct VlinkParam vlink_param;
};

/*
 * recive msg format
 * */
struct VlinkIpv6Trace		//
{
	struct in6_addr addr6;	//节点IPv6地址
};

struct VlinkPathMsg				//Vlink路径信息报文
{
	unsigned char type;			//报文类型标识
	unsigned char vlink_no;			//Vlink号
	unsigned char arr_len;			//路径中节点的数量
	struct VlinkIpv6Trace vlink_trace[];	//存放路径中节点的数组
};

struct VlinkStateInfo				//
{
	unsigned char vlink_no;			//Vlink号
	unsigned char status;			//Vlink状态
	unsigned char req_hop_num;		//Hello请求报文转发跳数
	unsigned char res_hop_num;		//Hello响应报文转发跳数
	unsigned long int rrt;			//报文往返时间
	struct in6_addr peer_addr;		//VR对端IPv6地址
	unsigned long int local_vlink_addr;	//Vlink本地IPv4地址
	unsigned long int peer_vlink_addr;	//Vlink对端IPv4地址
	unsigned short int hello_interval;	//Hello报文发送间隔
};

struct VlinkInfoMsg				//Vlink状态信息报文
{
	unsigned char type;			//报文类型标识
	unsigned char arr_len;			//报文中包含的Vlink数量
	unsigned char vlink_num;		//所在VR上的所有Vlink的数量
	struct VlinkStateInfo stat_info[];	//
};

#pragma pack(pop)
const int ADDR6STRLEN = 46;
#endif

